package com.cskaoyan.javase.oop1._12block._3static;

/**
 * 静态代码块: 指的是定义在类的成员位置,使用static修饰的代码块
 * 作用: 随着类加载(初始化这一步)而执行,可以用来完成静态成员变量的赋值,可以把它看成是一个在类加载过程中,会自动调用的一个静态成员方法.
 *
 * 总结一下,在类加载过程中,为静态成员变量赋值的方式:
 *          1.默认初始化
 *          2.显式赋值
 *          3.静态代码块
 * 显然,默认初始化是第一步,那么显式赋值和静态代码块,究竟谁先谁后呢?
 *      仍然是按照代码的书写顺序,按照从上到下的顺序执行,写在后面的最后执行,当然也是我们看到的结果
 *      正常情况下,仍然建议把静态代码块写在静态变量声明的下面.
 *
 * > 静态代码块在实际开发中，并不常见。根据它的一些特点，可以总结一下它的使用场景
 *
 * 1. 复杂的静态成员变量的赋值
 *    - （最经典的）JavaEE中加载JDBC驱动
 * 2. 如果有一段代码从始至终，只运行一次，可以写到静态代码块
 *      因为类加载只有一次,所以静态代码块在一次程序运行期间,至多运行一次
 *    - 比如一些初始化工作
 *
 * > 一些细节问题
 * 1. 静态代码块可以近似看成一个静态成员方法，所以不能在里面调用非静态（包括this和super）
 * 2. 当需要使用复杂的代码给静态成员变量赋值时，可以使用静态代码块
 *    - 但如果仅仅是简单的赋值，直接显式赋值即可
 * 3. 构造代码块可以给静态成员变量赋值，静态代码块却不能给普通成员代码块赋值
 *    - 类加载在创建对象之前进行，此时没有对象，肯定没有办法赋值
 * 4. 静态代码块和静态成员变量显式赋值的执行顺序，是由类加载的机制保证的
 *    - 类加载的具体流程，我们后面会学习，不必着急
 *
 * 5. 静态代码块也经常被用来测试类加载的顺序
 *    - **一个类的静态代码块如果没有被执行，至少说明它没有被完全类加载**（可能类加载流程走了一半）
 *
 *
 * @since 10:49
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    static {
        System.out.println("Demo类加载!");
    }
    public static void main(String[] args) {
        // System.out.println(Animal.name);
    }
}

class Animal {
    int age;

    static String name = "大脑斧";

    // 静态代码块
    static {
        name = "大橘";
        // age;
    }


}